package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

/**
 * java将流按照读写单位划分为字节流与字符流
 * java.io.InputStream和OutputStream是所有字节流的超类
 * java.io.Reader和Writer是所有字符流的超类
 *
 * 字节流最小读写单位是字节(byte,8位2进制)
 * 字符流的最小读写单位是字符(char),[字符流仅适合读写文本数据]
 *
 *
 * 转换流
 * java.io.InputStreamReader和java.io.OutputStreamWriter
 * 转换流是一对高级流,同时也是常用的字符流.
 * 实际开发中我们不会直接操作转换流,但是在流连接中他们是重要的一环.
 *
 * 在流连接中有一个特点:所有的字符流都是高级流,并且字符流只能连接在其它字符流上工作.而实际情况下
 * 低级流都是字节流,这意味着字符流无法直接串联在字节流上工作,原因是读写的数单位不同,字符流以字符
 * 为单位读写,字节流则以字节为单位读写.
 * 转换流是唯一一对可以连接在字节流上的字符流,主要工作就是负责将读写的字符与字节进行转换来衔接
 * 其它字符流与字节流的工作,因此它很像现实生活中我们常见的"转换器",比如HDMI转VGA.
 *
 */
public class OSWDemo {
    public static void main(String[] args) throws IOException {
        /*
            向文件osw.txt中写入字符串
         */
        FileOutputStream fos = new FileOutputStream("osw.txt");
        /*
            转换流创建时通常会指定第二个参数来明确字符集,如果不指定会按照系统默认字符集将写出的
            字符串转换为字节,这不利于跨平台.因此应当明确指定.
         */
        OutputStreamWriter osw = new OutputStreamWriter(fos,StandardCharsets.UTF_8);
        /*
            Writer上定义了写出字符串的方法:
            void write(String line)

            转换流的write方法在实现时会自动将写出的字符串转换为一组字节后再通过其连接的文件流
            最终将字节写入文件.
         */
        osw.write("我带着比身体中的行李,游入尼罗河底.");
        osw.write("经过几道闪电,看到一堆光圈,不确定是不是这里.");

        System.out.println("写出完毕");

        osw.close();
    }
}








